package com.ynet.eq.haiqing.common.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import com.baomidou.mybatisplus.extension.plugins.inner.*;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.LongValue;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import java.util.ArrayList;
import java.util.List;

/**
 * @author 胡超雄
 * @date 2021/7/15 16:21
 * @desc mybatis-plus配置类
 */
@Configuration
@EnableTransactionManagement
//@MapperScan(basePackages="com.ynet.eq.haiqing.crud.mapper")  // 当前 mapper  基础包
@MapperScan(basePackages = {"com.ynet.eq.haiqing.crud.mapper", "com.ynet.eq.aop.syslog.mapper"})  // 当前 mapper  基础包
public class MybatisPlusConfig {
    /**
     * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));

        // 多租户实现
        interceptor.addInnerInterceptor(new TenantLineInnerInterceptor(new TenantLineHandler() {
            @Override
            public Expression getTenantId() {
                return new LongValue(103);
            }

            /**
             *  数据库的字段
             * @return  user_id
             */
            @Override
            public String getTenantIdColumn() {
                return  "user_id";
            }


            // 这是 default 方法,默认返回 false 表示所有表都需要拼多租户条件
            @Override
            public boolean ignoreTable(String tableName) {
               // return !"user".equalsIgnoreCase(tableName);
                //默认所有的都会添加分租户
                return  false ;
            }
        }));
        // 如果用了分页插件注意先 add TenantLineInnerInterceptor 再 add PaginationInnerInterceptor
        // 用了分页插件必须设置 MybatisConfiguration#useDeprecatedExecutor = false
//        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }

    @Bean
    public ConfigurationCustomizer configurationCustomizer() {
        return configuration -> configuration.setUseDeprecatedExecutor(false);
    }

    /**
     * 1 SQL 执行分析拦截器【 目前只支持 MYSQL-5.6.3 以上版本 】，
     * 作用是分析 处理 DELETE UPDATE 语句， 防止小白或者恶意 delete update 全表操作！
     * 2 乐观锁插件
     *
     * @return MybatisPlusInterceptor
     */
    @Bean
    public MybatisPlusInterceptor createSqlExplainInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        List<InnerInterceptor> list = new ArrayList<>();
        list.add(new BlockAttackInnerInterceptor());  // 防止全表更新与删除
        list.add(new OptimisticLockerInnerInterceptor());   //乐观锁插件

        interceptor.setInterceptors(list);
        return interceptor;
    }




}
